package com.link.base.base.product.service;

import com.link.base.base.common.model.Attachment;
import com.link.base.base.common.model.Image;
import com.link.base.base.product.model.PriceListItem;
import com.link.base.base.product.model.Product;
import com.link.base.basic.model.ListOfValue;
import com.link.core.basic.service.BasicService;
import com.link.core.basic.service.BasicServiceException;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/** @author unknown @date unknown @comments 产品操作服务 */
public interface ProductService extends BasicService<Product> {
    /** 查找商机下未选择的产品 @param record @return 产品列表 @throws Exception */
    public List<Product> queryUnSelectedInOptyPage(Product record) throws Exception;

    /** 查找商机下未选择的产品 @param priceListItem @return 产品列表 @throws Exception */
    public List<Product> queryProductByPriceHeadId(PriceListItem priceListItem) throws Exception;

    /** 上传产品图片 @param myfiles @return 图片列表 @throws BasicServiceException */
    public List<Image> imgUpload(List<MultipartFile> myfiles) throws BasicServiceException;

    /** 添加产品图片 @param list @param record @throws BasicServiceException */
    public void productImageUpate(Product record, List<Image> list) throws BasicServiceException;

    /** 更新产品的详细信息 @param record @throws Exception */
    public void prodDetailsUpdate(Product record) throws Exception;

    /** 更新产品的型号 @param record @throws BasicServiceException */
    public void prodModelUpdate(Product record) throws BasicServiceException;

    /**
     * 订单-产品产品MVG：创建订单时选产品，产品MVG窗口中未选择的产品列表
     *
     * @param record
     * @return 产品列表
     * @throws Exception
     */
    public List<Product> queryProdOrderlistPage(Product record) throws Exception;

    /**
     * 查询产品及指定客户下的价格
     *
     * @param record
     * @return 产品列表
     * @throws Exception
     */
    public List<Product> queryProdWithAcctPricePage(Product record);

    /**
     * 查询单条产品及指定客户下的价格
     *
     * @param record
     * @return 产品
     * @throws Exception
     */
    public Product queryProdWithAcctPriceById(Product record) throws Exception;

    /**
     * 根据促销政策头ID查询符合符合条件的产品
     *
     * @param record
     * @return 产品列表
     * @throws Exception
     */
    public List<Product> queryProdWithAcctPriceByPcyId(Product record) throws Exception;

    /**
     * <p>根据促销政策结果id查询符合条件的产品，attr1</p>
     *
     * @author yrf
     * @param record
     * @return 产品列表
     * @throws Exception
     */
    public List<Product> queryProdWithAcctPriceByPcyResultId(Product record) throws Exception;


    /**
     * 根据价格头查询未选择的产品
     *
     * @param priceListItem 价格头
     * @return 产品列表
     * @throws Exception
     */
    public List<Product> queryUnSelectedInPriceListDetailPage(PriceListItem priceListItem) throws Exception;

    /**
     * 多价格表下，查询产品价格
     *
     * @param record
     * @return 产品列表
     * @throws Exception
     */
    public List<Product> queryPromoPriceByProduct(Product record) throws Exception;

    /**
     * 查询经销商的销售价格头下未选择的产品
     *
     * @author yrf
     * @param record
     * @return 产品列表
     * @throws Exception
     * @date 2018年5月16日
     */
    public List<Product> queryUnSelectedInDealerPriceListPage(Product record) throws Exception;

    /**
     * 查询经销商的要货计划单下未选择的产品
     *
     * @author weixuan
     * @param record
     * @return 产品列表
     * @throws Exception
     * @date 2018年12月6日
     */
    public List<Product> queryUnSelectedInPurchasePlanListPage(Product record) throws Exception;

    /**
     * 查询产品
     *
     * @param product 产品
     * @return 附件列表
     * @throws Exception 报错
     */
    public List<Attachment> queryProductPicByProdId(Product product) throws Exception;


    /**
     * 查询产品及指定客户下的价格
     *
     * @param t
     * @return 产品列表
     * @throws Exception
     * @date 2018年5月16日
     */
    public List<Product> queryProductWithAcctPricePage(Product t) throws Exception;

    /**
     * 通过id查询产品及标签
     *
     * @param t
     * @return 产品
     * @throws Exception
     */
    public Product queryProdById(Product t) throws Exception;

    /**
     * 重定义upsert方法
     *
     * @param t
     * @throws Exception
     */
    public void prodUpsert(Product t) throws Exception;

    /**
     * 删除指定id产品，同时删除该产品标签
     *
     * @param t
     * @throws Exception
     */
    public void deleteProdAndTagById(Product t) throws Exception;

    /**
     * 根据查询产品及指定客户查品牌
     *
     * @param record
     * @return List ListOfValue
     * @throws Exception author 刘鲁
     */
    List<ListOfValue> queryBrandList(Product record) throws Exception;

    /**
     * 查询热销产品
     *
     * @param entity
     * @return 产品列表
     * @throws Exception author 刘鲁
     */
    public List<Product> queryHotProduct(Product entity) throws Exception;

    /**
     * 查询不同类别产品的第一条 by lizt 20170703
     *
     * @param entity
     * @return 产品列表
     * @throws Exception
     */
    public List<Product> queryProductByType(Product entity) throws Exception;

    /**
     * 使用于php调用的queryById方法
     *
     * @param entity
     * @return 产品
     * @throws Exception
     */
    public Product queryByIdForShare(Product entity) throws Exception;

    /**
     * 查询产品系列 且去除重复项 用于筛选
     *
     * @param record
     * @return 产品列表
     * @throws Exception
     */
    public List<Product> queryProdMatSeries(Product record) throws Exception;

    /**
     * 按照创建时间,查询维护了二级系列的产品的第一条数据
     *
     * @param record 产品
     * @return 产品列表
     * @throws Exception 异常信息
     */
    public Map<String, List<Product>> queryProdSecSeries(Product record) throws Exception;

    /**
     * 根据订单行上的产品,获取销售数量最高的5个产品
     *
     * @param record 产品信息
     * @return 产品列表
     * @throws Exception 异常信息
     */
    public List<Product> queryHotProductByOrder(Product record) throws Exception;

    /**
     * queryByGoodProdId
     *
     * @param product
     * @return map
     * @throws Exception
     */
    Map<String, Object> queryByGoodProdId(Product product) throws Exception;

    /**
     * s生成小程序二维码
     *
     * @param produc
     * @return map
     * @throws Exception
     */
    Map<String, Object> createMiniprogramCode(Product produc) throws Exception;

    /**
     * 商品保存
     *
     * @param produc
     * @return map
     * @throws Exception
     */
    Map<String, Object> saveProduct(Product produc) throws Exception;

    /**
     * 小程序查询所有维护有产品的一级系列
     *
     * @param produc
     * @return 系列
     * @throws Exception 异常信息
     */
    public List<Product> queryHasProdMatSeries(Product produc) throws Exception;

    /**
     * 查询小程序商品详情
     * @author lujiang
     *
     * @param product
     * @return 系列
     * @throws Exception 异常信息
     */
    Map<String, Object> queryByProdId(Product product) throws Exception;

    /**
     * 获取商品下产品最低价
     *
     * @param list
     * @return 产品列表
     * @throws Exception 异常信息
     */
    List<Product> getGoodSalePrice(List<Product> list) throws Exception;

    /**
     * 查询小程序排序前9的三级系列
     *
     * @author KuangRuifeng
     * @param product 产品信息
     * @return 系列
     * @throws Exception 异常信息
     */
    List<Product> queryHotThdSeries(Product product) throws Exception;

    /**
     * 更改产品销量
     *
     * @param product
     * @throws Exception
     */
    void updateCumulateSale(Product product) throws Exception;

    /**
     * 新建小程序产品
     * @author wangdawei
     * @param product
     * @return
     * @throws Exception 异常信息
     */
    public Map<String, Object> newMpProd(Product product) throws Exception;

    /**
     * 编辑小程序产品
     * @author wangdawei
     * @param product
     * @return
     * @throws Exception 异常信息
     */
    public Map<String, Object> updateMpProd(Product product) throws Exception;

    /**
     * 编辑小程序产品 数据回显
     * @author wangdawei
     * @param product
     * @return
     * @throws Exception 异常信息
     */
    public Map<String, Object> getMpProdInfo(Product product) throws Exception;

    /**
     * 根据id查询品牌系列信息
     * @author KuangRuifeng
     * @date 2019/1/8
     * @param productId 行id
     * @return 查询结果
     * @throws Exception 异常信息
     */
    Product queryBrandSeriesById(Long productId) throws Exception;

    /**
     * 校验产品编码
     * @author wangdawei
     * @date 2019/1/10
     * @param prodCode 产品编码
     * @return 查询结果
     * @throws Exception 异常信息
     */
    public Boolean checkProdCode(String prodCode) throws Exception;

    /**
     *根据组织ID 获取价格表然后获取价格表下的产品
     * @author 黄正杨
     * @date 2019/4/23
     * @param product
     * @return List
     * @throws Exception
     */
    List<Product> queryByOrgIdPage(Product product) throws Exception;

    /**
     * 从门店迁移根据物流追溯码查询产品功能
     * @author 姚江漪
     * @date 2019/08/14 16:49
     */
    public Map<String,Object> queryProductByLogCode(Product product) throws Exception;

    /**
     * 物流追溯码查询产品未找到时进行手工录入
     * @author 姚江漪
     * @date 2019/08/14 16:49
     */
    public Product queryProductByManual(Product product) throws Exception;
}
